home *** CD-ROM | disk | FTP | other *** search
/ Mac-Source 1994 July / Mac-Source_July_1994.iso / C and C++ / System / Autocruise source / Init.c < prev    next >
C/C++ Source or Header  |  1989-11-16  |  2KB  |  76 lines

  1. /* Init.c */
  2. /*
  3.  * The init resource that installs the patch for the AutoCruise Mouse.
  4.  * Be sure to set the attributes bits so this INIT resource is locked.
  5.  * INIT 31 fails to do this for us.
  6.  */
  7.  
  8. #include "Cruise.h"
  9.  
  10. main()
  11.     {
  12.     
  13.     register    crsrTaskVarsP varsAddress;
  14.     register    Ptr              PatchPtr;
  15.  
  16.     asm        /* Real men do it in assembly.        */
  17.         {
  18.         clr.l        DeskHook            /* Why? Because DTS says so.    */
  19.         
  20.         clr.l        -(sp)
  21.         move.l        #'COOL',-(sp)
  22.         move.w        #128,-(sp)
  23.         _GetResource
  24.         move.l        (a7),a1        /* leave result on stack for next trap */
  25.         _DetachResource
  26.         move.l        (a1),PatchPtr    /* put it somewhere */
  27.         
  28.         move.l        #sizeof(crsrTaskVars),d0
  29.         _NewPtr        SYS+CLEAR
  30.         move.l        a0,varsAddress        /* remember where it is for later */
  31.         }
  32.         
  33.     /* 
  34.      * init variables.  This prevents the cursor from jumping wildly
  35.      * around the screen at bootup.  It isn't strictly necessary, but it
  36.      * doesn't hurt.  Actually, I've now discovered that it is REALLY
  37.      * important, and nothing will work worth two pickles if you
  38.      * don't initialize everything.
  39.      */
  40.  
  41.     varsAddress->OldCrsrTask=jCrsrTask;
  42.     varsAddress->Prevh=(FixFlot)(Mouse.h)<<3;
  43.     varsAddress->Prevv=(FixFlot)(Mouse.v)<<3;
  44.     varsAddress->PrevInth=(FixFlot)Mouse.h;
  45.     varsAddress->PrevIntv=(FixFlot)Mouse.v;
  46.     varsAddress->LastTimeh=Ticks;
  47.     varsAddress->LastTimev=Ticks;
  48.  
  49.     /*
  50.      * Slightly specialized stuff.  Basically, we install the patch
  51.      * by modifing some zero page globals.
  52.      */
  53.     asm
  54.         {
  55.         move.l        PatchPtr,a0    /* get saved pointer */
  56.  
  57.         move.l        varsAddress,(a0)    /* tell patch where to find its vars */
  58.         addq.l        #4,a0
  59.         move.l        a0,jCrsrTask        /* tell system about patch */
  60.         }
  61.         
  62.     }
  63.  
  64. /*
  65.  * Notice than an application or cdev can check to see if this patch
  66.  * is installed by the following nifty trick:
  67.  *
  68.  * Pointer    *aPtr;
  69.  *
  70.  * aPtr=jCrsrTask;
  71.  * aPtr--;         *** remember, '--' (of a pointer pointer) -> '-=4' ***
  72.  * if (GetPointerSize(*aPtr)==sizeof(crsrTaskVars))
  73.  *    { It's installed }
  74.  * else
  75.  *  { It's not installed }
  76.  */